home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1996 #6 / Amiga Plus CD - 1996 - No. 06.iso / pd / programmierung / proasm / examples / cxchange / cxchange.s < prev   
Text File  |  1996-04-12  |  9KB  |  405 lines

  1. ;-------------------------------------------------------------------------------
  2. *                                                                              *
  3. * CxChange                                                                     *
  4. *                                                                              *
  5. * Written 1994 by Daniel Weber                                                 *
  6. * Written using the ProAsm assembler                                           *
  7. *                                                                              *
  8. *                                                                              *
  9. *       Filename        cxchange.s                                             *
  10. *       Author          Daniel Weber                                           *
  11. *       Version         1.02                                                   *
  12. *       Start           16.01.94                                               *
  13. *                                                                              *
  14. *       Last Revision   22.02.94                                               *
  15. *                                                                              *
  16. ;-------------------------------------------------------------------------------
  17. *                                                                              *
  18. *    command line options                                                   *
  19. *                                                                              *
  20. *    -a = -e     activate/enable commodity                                  *
  21. *    -i = -d     inactivate/disable commodity                               *
  22. *    -h          show interface                                             *
  23. *    -r = -k     remove/kill interface (default)                            *
  24. *    -s          hide interface                                             *
  25. *                                                                              *
  26. ;-------------------------------------------------------------------------------
  27.  
  28.     output    'ram:cxchange'
  29.  
  30.     opt    o+,q+,ow-,qw-
  31.     verbose
  32.     base    progbase
  33.  
  34.     filenote    'CxChange, Written 1994 by Daniel Weber'
  35.  
  36. ;-------------------------------------------------------------------------------
  37.  
  38.     incdir    'include:'
  39.     incdir    'routines:'
  40.  
  41.     include    'exec/types.i'
  42.     include    'exec/lists.i'
  43.     include    'exec/nodes.i'
  44.     include    'libraries/commodities.i'
  45.     incequ    'LVO.s'
  46.     include    'basicmac.r'
  47.     include    'support.mac'
  48.  
  49. ;-------------------------------------------------------------------------------
  50.  
  51. version        equr    "1.02"
  52. gea_progname    equr    "CxChange"
  53.  
  54. ;-- startup control  --
  55. cws_V37PLUSONLY    set    1            ;only OS2.x or higher
  56. cws_CLIONLY    set    1            ;for CLI usage only
  57. cws_EASYLIB    set    1
  58.  
  59. ;-- user definitions --
  60. AbsExecBase    equ    4
  61. DOS.LIB        equ    1
  62. COMMODITIES.LIB    equ    37
  63.  
  64.  
  65. workspace    equ    256            ;workbuffer
  66.  
  67. ;-- PRIVAT commodities.library functions --
  68. *_LVOFindBroker        EQU    -108    ;(char*)(a0)
  69. _LVOCopyBrokerList    EQU    -186    ;(struct List*)(a0)
  70. _LVOFreeBrokerList    EQU    -192    ;(struct List*)(a0)
  71. _LVOBrokerCommand    EQU    -198    ;(char */LONG id)(a0/d0)
  72.  
  73. ;-- PRIVAT structure
  74. ;struct BrokerCopy {
  75. ;    STRUCT Node    bc_Node;
  76. ;    char    bc_Name[CBD_NAMELEN];
  77. ;    char    bc_Title[CBD_TITLELEN];
  78. ;    char    bc_Descr[CBD_DESCRLEN];
  79. ;    LONG    bc_Task;
  80. ;    LONG    bc_Dummy1;
  81. ;    LONG    bc_Dummy2;
  82. ;    UWORD    bc_Flags; }
  83.  
  84.         RSRESET    0
  85. bc_Node        RS.B    LN_SIZE
  86. bc_Name        RS.B    CBD_NAMELEN
  87. *bc_Title    RS.B    CBD_TITLELEN
  88. *bc_Descr    RS.B    CBD_DESCRLEN
  89. *bc_Task    RS.L    1
  90. *bc_Dummy1    RS.L    1
  91. *bc_Dummy2    RS.L    1
  92. *bc_Flags    RS.W    1
  93.  
  94.  
  95. ;-------------------------------------------------------------------------------
  96. progbase:
  97.     jmp    AutoDetach(pc)
  98.     dc.b    0,"$VER: ",gea_progname," ",version," (",__date2,")",0
  99.     even
  100.  
  101. ;----------------------------
  102. clistartup:
  103.     lea    progbase(pc),a5
  104.     lea    dxstart(pc),a1            ;clear DX area
  105.     move.w    #(dxend-dxstart)/2-1,d7
  106. .clr:    clr.w    (a1)+
  107.     dbra    d7,.clr
  108.  
  109.     move.l    a7,InitialSP(a5)
  110.     move.l    a0,ArgStr(a5)
  111.     move.l    d0,ArgLen(a5)
  112.  
  113.     lea    TitleText(pc),a0
  114.     printtext_
  115.  
  116.     bsr    ReadParameters
  117.     bne    exit
  118. loop
  119. .loop:    bsr    DoCommodity
  120.     bsr    NextName
  121.     beq.s    .loop
  122.  
  123. exit:    move.l    InitialSP(pc),a7
  124. .quit:    moveq    #0,d0
  125.     bra    ReplyWBMsg
  126.  
  127.  
  128. ;----------------------------------------------------------
  129. *
  130. * ReadParameters    - small command line parser
  131. *
  132. * a5: progbase
  133. *
  134. * => a0: pointer to zero ended string
  135. * => CCR:  Z ok,  N failed usage, printed
  136. *
  137. ReadParameters:
  138.     move.l    ArgStr(pc),a0
  139.     move.l    ArgLen(pc),d7
  140.     clr.b    -1(a0,d7.l)
  141.     bsr    arg_spacekiller
  142.  
  143.     cmp.b    #"?",(a0)            ;force usage?
  144.     bne.s    .options
  145.     tst.b    1(a0)
  146.     beq    .usage
  147.     cmp.b    #" ",1(a0)
  148.     beq    .usage
  149.  
  150. .options:
  151.     clr.w    docx(a5)        ;[docx=0] 
  152.     tst.b    (a0)
  153.     beq.s    .src
  154.     cmp.b    #"-",(a0)
  155.     bne.s    .usage
  156.     addq.l    #1,a0
  157.     move.b    (a0)+,d0        ;get option
  158.     beq.s    .usage
  159.     and.b    #$df,d0
  160.     addq.w    #2,docx(a5)
  161.     cmp.b    #"A",d0            ;activate [docx=2] 
  162.     beq.s    .endopts
  163.     cmp.b    #"E",d0            ;enable (=activate) [docx=2] 
  164.     beq.s    .endopts
  165.     addq.w    #2,docx(a5)
  166.     cmp.b    #"I",d0            ;inactivate [docx=4] 
  167.     beq.s    .endopts
  168.     cmp.b    #"D",d0            ;disable (=inactivate) [docx=4] 
  169.     beq.s    .endopts
  170.     addq.w    #2,docx(a5)
  171.     cmp.b    #"S",d0            ;show interface [docx=6] 
  172.     beq.s    .endopts
  173.     addq.w    #2,docx(a5)
  174.     cmp.b    #"H",d0            ;hide interface [docx=8] 
  175.     beq.s    .endopts
  176.     addq.w    #2,docx(a5)
  177.     cmp.b    #"U",d0            ;unique [docx=10] 
  178.     beq.s    .endopts
  179.     addq.w    #2,docx(a5)
  180.     cmp.b    #"K",d0            ;kill (=remove) [docx=0]
  181.     beq.s    .endopts
  182.     cmp.b    #"R",d0            ;remove [docx=0] 
  183.     bne.s    .usage
  184. .endopts:
  185.     bsr    arg_spacekiller
  186. .src:    move.l    a0,ArgStr(a5)
  187.     bsr.s    arg_skip
  188.     add.l    d4,ArgStr(a5)
  189.     sub.l    d4,a0
  190.     clr.b    (a0)+
  191.     move.l    ArgStr(pc),a1
  192.     move.l    a0,ArgStr(a5)
  193.     move.l    a1,a0
  194.     moveq    #0,d0
  195.     rts
  196.  
  197.  
  198. ;
  199. ; print usage
  200. ;
  201. .usage:    lea    UsageText(pc),a0
  202.     printtext_
  203.     moveq    #-1,d0
  204.     rts
  205.  
  206.  
  207. ;----------------------------------------------------------
  208. *
  209. * <command line parse routines>
  210. *
  211. * skip text
  212. *
  213. * => d4: correction
  214. *
  215. arg_skip:                ;skip an argument
  216.     moveq    #0,d4
  217.     moveq    #0,d5
  218.     cmp.b    #$22,(a0)
  219.     bne.s    \do
  220. \strt:    move.b    (a0)+,d5
  221.     moveq    #1,d4
  222. \do:    move.b    (a0)+,d0
  223.     beq.s    \ends
  224.     cmp.b    d0,d5
  225.     bne.s    .d2
  226.     cmp.b    (a0)+,d5
  227.     bne.s    \ends
  228.  
  229. .d2:    cmp.b    #" ",d0
  230.     bne.s    \do
  231.     tst.b    d5
  232.     bne.s    \do
  233. \ends:    subq.l    #1,a0
  234.     rts
  235.  
  236.  
  237. *
  238. * skip spaces
  239. *
  240. arg_spacekiller:            ;kill spaces...
  241.     cmp.b    #" ",(a0)+
  242.     beq.s    arg_spacekiller
  243.     subq.l    #1,a0
  244.     rts
  245.  
  246. ;----------------------------------------------------------
  247. *
  248. * get next name from argument string
  249. *
  250. * => a0: pointer to zero ended string
  251. * => CCR:  Z ok,  zN failed usage, printed
  252. *
  253. NextName:
  254.     move.l    ArgStr(pc),a0
  255.     bsr    arg_spacekiller
  256.     tst.b    (a0)            ;source file
  257.     beq.s    .nnext
  258.     move.l    a0,ArgStr(a5)
  259.     bsr.s    arg_skip
  260.     add.l    d4,ArgStr(a5)
  261.     sub.l    d4,a0
  262.     clr.b    (a0)+
  263.     move.l    ArgStr(pc),a1
  264.     move.l    a0,ArgStr(a5)
  265.     move.l    a1,a0
  266.     moveq    #0,d0
  267.     rts
  268. .nnext:    moveq    #-1,d0
  269.     rts
  270.  
  271.  
  272. ;----------------------------------------------------------
  273. *
  274. * DoRawFmt
  275. *
  276. * a0: format
  277. * a1: data stream
  278. * a3: dest. buffer
  279. *
  280. DoRawFmt:
  281.     movem.l    d0-a6,-(a7)
  282.     lea    .setin(pc),a2
  283.     move.l    4.w,a6
  284.     jsr    _LVORawDoFmt(a6)
  285.     movem.l    (a7)+,d0-a6
  286.     rts
  287.  
  288. .setin:    move.b    d0,(a3)+
  289.     rts
  290.  
  291.  
  292. ;-------------------------------------------------------------------------------
  293. *
  294. * DoCommodity    - sent a message to the specified commodity
  295. *
  296. ;-------------------------------------------------------------------------------
  297.  
  298. ;
  299. ; a0: name of commodity or pointer to zero byte
  300. ;
  301. DoCommodity:
  302.     move.l    CommoditiesBase(pc),a6
  303.     tst.b    (a0)
  304.     beq.s    .sendtoall
  305.     moveq    #0,d0
  306.     move.w    docx(pc),d0
  307.     beq    .out
  308.     move.w    .cx_ID-2(pc,d0.w),d0    ;get id
  309.     jmp    _LVOBrokerCommand(a6)
  310.  
  311. ;
  312. ; ID list for idnumber to id conversion
  313. ;
  314. .cx_ID:    dc.w    CXCMD_ENABLE    ;enable
  315.     dc.w    CXCMD_DISABLE    ;disable
  316.     dc.w    CXCMD_APPEAR    ;show interface
  317.     dc.w    CXCMD_DISAPPEAR    ;hide interface
  318.     dc.w    CXCMD_UNIQUE    ;unique
  319.     dc.w    CXCMD_KILL    ;kill
  320.  
  321. ;
  322. ; send commodity id to all system commodities
  323. ;
  324. .sendtoall:
  325.     lea    cxlist(pc),a0
  326.     NEWLIST    a0                ;macro from exec/lists.i
  327.     move.l    a0,a2
  328.     jsr    _LVOCopyBrokerList(a6)        ;copy broker list
  329.  
  330.  
  331.     move.l    LH_HEAD(a2),d0
  332.     beq.s    .out
  333.     move.l    d0,a2
  334.  
  335. .cxloop:
  336.     tst.l    (a2)
  337.     beq.s    .out
  338.     lea    bc_Name(a2),a0
  339.     lea    rawlist(pc),a1
  340.     move.l    a0,(a1)
  341.     lea    processtext(pc),a0
  342.     lea    workbuffer(pc),a3
  343.     bsr    DoRawFmt
  344.     lea    workbuffer(pc),a0
  345.     printtext_
  346.     moveq    #0,d0
  347.     move.w    docx(pc),d0
  348.     beq.s    .next
  349.     move.w    .cx_ID-2(pc,d0.w),d0        ;get ID
  350.     lea    bc_Name(a2),a0
  351.     jsr    _LVOBrokerCommand(a6)
  352. .next:    move.l    (a2),a2
  353.     bra.s    .cxloop
  354.  
  355. .endcx:    lea    cxlist(pc),a0
  356.     jsr    _LVOFreeBrokerList(a6)
  357. .out:    rts
  358.  
  359.  
  360. ;-------------------------------------------------------------------------------
  361. *
  362. * external routines
  363. *
  364. ;-------------------------------------------------------------------------------
  365.     include    startup4.r
  366.  
  367.  
  368. ;-------------------------------------------------------------------------------
  369. *
  370. * data area
  371. *
  372. ;-------------------------------------------------------------------------------
  373.  
  374. TitleText:    dc.b    $9b,"1m",gea_progname,$9b,"0m v",version
  375.         dc.b    " - controls system commodities",$a
  376.         dc.b    "Written 1994 by Daniel Weber",$a,0
  377.  
  378. UsageText:    dc.b    $a
  379.         dc.b    "Usage: ",$9b,"3m",gea_progname
  380.         dc.b    " [-options name [names]]"
  381.         dc.b    $9b,"0m",$a,0
  382.  
  383. processtext:    dc.b    """%s""",$a,0
  384.         even
  385.  
  386. dxstart:
  387. ;-------------------------------------------------------------------------------
  388. InitialSP:    dx.l    1
  389. ArgStr:        dx.l    1        ;parameter line
  390. ArgLen:        dx.l    1        ;parameter line length
  391.  
  392. ;--- commoditiy -------------------------------------------
  393. docx:        dx.w    1        ;broker command number
  394. cxlist:        dx.b    LH_SIZE        ;space for broker list
  395.  
  396.  
  397. ;--- workbuffer -------------------------------------------
  398. rawlist:    dx.l    1        ;buffer for rawlist
  399. workbuffer:    dx.b    workspace    ;workbuffer
  400.  
  401. ;-------------------------------------------------------------------------------
  402.     aligndx.w
  403. dxend:
  404.     end
  405.